uvolnenie pamati TStrings.objects
Otázka od: Lubos Urban
11. 10. 2002 8:53
Ahojte
Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
pricom som nadefinoval vlastnu metodu
function TExComboBox.AddItem(ItemText: String; idKey, idValue: Integer;
txValue: string): Integer;
var Index: Integer;
ItemData: TItemData;
begin
Index:= self.Items.Add(ItemText);
ItemData:= TItemData.Create;
ItemData.idkey:= idKey;
ItemData.idValue:= idValue;
ItemData.txValue:= txValue;
Items.Objects[Index]:= ItemData;
Result:= Index;
end;
ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;
Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky objekty
ktore sa pri volani metody AddItem vytvorili.
destructor TExComboBox.Destroy;
begin
for i:= 0 to self.Items.Count - 1 do
Items.Objects[Index].Free;
inherited Destroy;
end;
padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
Akym sposobom sa potom da uvolnit naalokovana pamat ktoru zaberaju objekty asociovane s jednotlivymi polozkami ComboBoxu ???
Poradte niekto, prosim,,,,
Odpovedá: Petr Brant
11. 10. 2002 10:39
Nevim to sice jiste, ale mozna, ze je na to uz pozde, i kdyz nevim, z jakych
duvodu. Zkus to upravit tak, aby se to uvolnilo jeste pred volanim
destruktoru, jestli by to pomohlo a pak se uvidi.
RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234
Subject: uvolnenie pamati TStrings.objects
Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
pricom som nadefinoval vlastnu metodu
function TExComboBox.AddItem(ItemText: String; idKey, idValue: Integer;
txValue: string): Integer;
var Index: Integer;
ItemData: TItemData;
begin
Index:= self.Items.Add(ItemText);
ItemData:= TItemData.Create;
ItemData.idkey:= idKey;
ItemData.idValue:= idValue;
ItemData.txValue:= txValue;
Items.Objects[Index]:= ItemData;
Result:= Index;
end;
ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;
Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
objekty ktore sa pri volani metody AddItem vytvorili.
destructor TExComboBox.Destroy;
begin
for i:= 0 to self.Items.Count - 1 do
Items.Objects[Index].Free;
inherited Destroy;
end;
padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
Odpovedá: Lubos Urban
11. 10. 2002 11:44
No skusim som to urobit na message WM_DESTROY ktory sa obsluzi skorej ako sa
zavola destruktor, ale nie som si isty ci je to spravne, ak by ste niekto
vedeli ako to spravit inak takporadte
dakujem
----- Original Message -----
From: "Petr Brant" <brant@dcomm.cz>
To: <delphi-l@clexpert.cz>
Sent: Friday, October 11, 2002 10:37 AM
Subject: RE: uvolnenie pamati TStrings.objects
Nevim to sice jiste, ale mozna, ze je na to uz pozde, i kdyz nevim, z jakych
duvodu. Zkus to upravit tak, aby se to uvolnilo jeste pred volanim
destruktoru, jestli by to pomohlo a pak se uvidi.
RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234
Subject: uvolnenie pamati TStrings.objects
Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
pricom som nadefinoval vlastnu metodu
function TExComboBox.AddItem(ItemText: String; idKey, idValue: Integer;
txValue: string): Integer;
var Index: Integer;
ItemData: TItemData;
begin
Index:= self.Items.Add(ItemText);
ItemData:= TItemData.Create;
ItemData.idkey:= idKey;
ItemData.idValue:= idValue;
ItemData.txValue:= txValue;
Items.Objects[Index]:= ItemData;
Result:= Index;
end;
ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;
Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
objekty ktore sa pri volani metody AddItem vytvorili.
destructor TExComboBox.Destroy;
begin
for i:= 0 to self.Items.Count - 1 do
Items.Objects[Index].Free;
inherited Destroy;
end;
padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
Odpovedá: Blazek Jaroslav
11. 10. 2002 12:55
Ahoj,
>Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
>pricom som nadefinoval vlastnu metodu
>ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;
>Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
>objekty ktore sa pri volani metody AddItem vytvorili.
>destructor TExComboBox.Destroy;
>begin
> for i:= 0 to self.Items.Count - 1 do
> Items.Objects[Index].Free;
> inherited Destroy;
>end;
zkusil jsem si neco podobneho a je vse v poradku
tady je prikladek
http://sweb.cz/data.product/Delphi/5/TExCombo.zip
jen pozor na pouziti ExCombo.Items.Clear();
S pozdravem
Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644
Odpovedá: Blazek Jaroslav
11. 10. 2002 11:54
Ahoj,
>Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
>pricom som nadefinoval vlastnu metodu
pardon trochu mi to ujelo
http://sweb.cz/data.product/Delphi/5/TExCombo/TExCombo.zip
S pozdravem
Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644
Odpovedá: Petr Vones
12. 10. 2002 20:06
From: "Lubos Urban" <Lubos.Urban@visicom.sk>
> Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
> objekty ktore sa pri volani metody AddItem vytvorili.
> padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
TComboBox uklada data do ovladaciho prvku Windows, takze je nutne aby pri
praci s daty tento prvek existoval. Uvolneni musis provest v reakci na zpravu
WM_DESTROY. Nelze pouzit metodu TWinControl.DestroyWnd protoze ta se vola
pouze v pripade ze dojde k znovuvytvoreni handle pomoci metody RecreateWnd.
Petr Vones
Odpovedá: Lubos Urban
15. 10. 2002 7:15
Problem je v tom, ze ked som to aj robil cez WM_DESTROY tak tento message mi
prisiel aj pri volani RecreateWnd
Ja sice vo svojom kode komponenty nevolam tuto metodu, ale kedze neviem ako
pracuju komponety zalozene na ovladacich prvkoch Windows, neviem ci mi
predok niekedy nahodou nezavola tuto metodu a tym mi nezrusi pointre na
vsetky tie objekty
----- Original Message -----
From: "Petr Vones" <pvones@mbox.vol.cz>
To: "Konference Delphi" <delphi-l@clexpert.cz>
Sent: Saturday, October 12, 2002 9:06 PM
Subject: Re: uvolnenie pamati TStrings.objects
> From: "Lubos Urban" <Lubos.Urban@visicom.sk>
> > Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
> > objekty ktore sa pri volani metody AddItem vytvorili.
> > padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
>
> TComboBox uklada data do ovladaciho prvku Windows, takze je nutne aby pri
> praci s daty tento prvek existoval. Uvolneni musis provest v reakci na
zpravu
> WM_DESTROY. Nelze pouzit metodu TWinControl.DestroyWnd protoze ta se vola
> pouze v pripade ze dojde k znovuvytvoreni handle pomoci metody
RecreateWnd.
>
> Petr Vones
>
>
>
>
Odpovedá: Petr Vones
15. 10. 2002 13:37
From: "Lubos Urban" <Lubos.Urban@visicom.sk>
> Problem je v tom, ze ked som to aj robil cez WM_DESTROY tak tento message mi
> prisiel aj pri volani RecreateWnd
To je prece naprosto spravne. Data (TStrings) jsou ulozena v tom ovladacim
prvku a pri RecreateWnd dojde k jeho znovuvytvoreni a jsou tedy ztracena.
Pokud potrebujes aby byly data zachovany tak si je musis v metode DestroyWnd
ulozit do nejakeho docasneho seznamu a v CreateWnd pak z toho seznamu vlozit
zpet do prave nove vytvoreneho ovladaciho prvku. Podivej se do zdrojaku VCL
komponent, tam to najdes.
Petr Vones